/**
 * Software License, Version 1.0
 * 
 * Copyright 2003 The Trustees of Indiana University.  All rights reserved.
 * 
 *
 *Redistribution and use in source and binary forms, with or without 
 *modification, are permitted provided that the following conditions are met:
 *
 *1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 *2) All redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 *3) Any documentation included with all redistributions must include the 
 * following acknowledgement:
 *
 *"This product includes software developed by the Community Grids Lab. For 
 * further information contact the Community Grids Lab at 
 * http://communitygrids.iu.edu/."
 *
 * Alternatively, this acknowledgement may appear in the software itself, and 
 * wherever such third-party acknowledgments normally appear.
 * 
 *4) The name Indiana University or Community Grids Lab or NaradaBrokering, 
 * shall not be used to endorse or promote products derived from this software 
 * without prior written permission from Indiana University.  For written 
 * permission, please contact the Advanced Research and Technology Institute 
 * ("ARTI") at 351 West 10th Street, Indianapolis, Indiana 46202.
 *5) Products derived from this software may not be called NaradaBrokering, 
 * nor may Indiana University or Community Grids Lab or NaradaBrokering appear
 * in their name, without prior written permission of ARTI.
 * 
 *
 * Indiana University provides no reassurances that the source code provided 
 * does not infringe the patent or any other intellectual property rights of 
 * any other entity.  Indiana University disclaims any liability to any 
 * recipient for claims brought by any other entity based on infringement of 
 * intellectual property rights or otherwise.  
 *
 *LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO 
 *WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 *NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF 
 *INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS. 
 *INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS", 
 *"VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.  
 *LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR 
 *ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION 
 *GENERATED USING SOFTWARE.
 */
package cgl.narada.transport;

import java.util.Properties;

/** The LinkFactory construct is associated with a given transport type and is
    responsible for the management/creation of links of that transport type. A
    linkFactory implementation is responsible for the creation of link to a 
    given node and also to facilitate the handling of inbound links as a result
    of link creations initiated at another LinkFactory instance. LinkFactory 
    also has methods which allow it to set performance status intervals for all
    its managed links. It also contains a method to manage migration of
    transports for a given link. Individual transport implementations would
    have different <b>properties</b> associated with theem for initializing the
    link factory, just as the createLink would have different properties to
    facilitate creation of links.

    @author Shrideep Pallickara
    $Date$
    $Revision$
*/


public interface LinkFactory {
  
  /* These are the set of properties that are needed to set up the 
     link Factory. */
  public void setLinkFactoryProperties(Properties factoryProperties);
  
  /** Return the type of all the links created/managed by this factory */
  public String getManagedLinksType();
  
  /** Create a communication link based on the properties that have been
      specified. */
  public Link createLink(Properties connectionProperties) 
    throws TransportException;
  
  /** Set the interval for checking status of all links managed by this
      factory to the one specified in the argument */
  public void setLinkStatusInterval(long interval);
  
  /** Start communication services. In the case of TCP for example, the
      thread which incorporates the serverSocket.accept() is started*/
  public boolean loadLinkFactoryServices() throws TransportException;
 
  /** Indicates if this factory can manage migration of links of a certain
      type */
  public boolean canManageLinkMigrationOfType(String linkType);
  
  /** Used to migrate communications of a link to the one supported by
      links managed by this factory */
  public void manageLinkMigration(Link link) throws TransportException;
  

  /** Sets the reference to the transport handler. This is done during the
      loadLinkFactory() operation within the transport handler 
      implementations. */
  public void setTransportHandler(TransportHandler transportHandler);

  /** This method is used to garbage collect any resources associated with
      the link factory */

  public void dispose();
  
}

